<template>
  <div class="search">
    <van-nav-bar fixed title="商品列表" left-arrow @click-left="$router.go(-1)" />

    <van-search
      readonly
      shape="round"
      background="#ffffff"
      :value="querySearch || '搜索商品'"
      show-action
      @click="$router.push('/search')"
    >
      <template #action>
        <van-icon class="tool" name="apps-o" />
      </template>
    </van-search>

    <!-- 排序选项按钮 -->
    <div class="sort-btns">
      <div class="sort-item">综合</div>
      <div class="sort-item">销量</div>
      <div class="sort-item">价格 </div>
    </div>

    <!-- 如果请求后端得到的是空列表的话就显示这个 -->
    <van-empty v-if="flag" description="抱歉, 没有数据" />

    <div class="goods-list">
      <!-- 这是上拉加载组件 -->
      <van-list
        v-model="loading"
        :finished="finished"
        :immediate-check="false"
        finished-text="没有更多了"
        @load="onLoad"
      >
        <GoodsItem v-for="item in proList" :key="item.goods_id" :item="item"></GoodsItem>
      </van-list>
    </div>
  </div>
</template>

<script>
import GoodsItem from '@/components/GoodsItem.vue'
import { getProList } from '@/api/product'
export default {
  name: 'SearchIndex',
  components: {
    GoodsItem
  },
  computed: {
    /** 获取地址栏的搜索关键字 */
    querySearch () {
      return this.$route.query.search
    }
  },
  data () {
    return {
      /**
       * vant分页组件
       * 参考：https://youzan.github.io/vant/v2/#/zh-CN/list
       */
      loading: false,
      finished: false,

      /** 查询的页数 */
      page: 1,
      /** 商品的列表 */
      proList: [],
      pageSize: 6,
      
      /**
       * 不显示空
       */
      flag: false
    }
  },
  methods: {
    /**
     * 请求后端接口，获取商品列表数据
     * @param {Object} params 对象{ text, categoryId, page, pageSize }
     */
    getroadList (params) {
      // 请求API
      getProList(params).then(res => {
        const rows = res.data // 请求返回当页的列表

        this.loading = false

        // 将新数据与老数据进行合并
        this.proList = this.proList.concat(rows)

        // 由于每页pageSize条数据，如果数据总数this.proList.length小于当前页数 * this.pageSize，说明最新页的数据不足this.pageSize条，因此可以显示到底了
        if (this.proList.length < this.page * this.pageSize) {
          this.finished = true
        }
      })
    },
    onLoad () {
      this.page++
      this.getroadList({
        categoryId: 0,
        page: this.page,
        pageSize: this.pageSize
      })
    }
  },
  async created () {
    const { data } = await getProList({ // 请求第一页
      text: this.querySearch,
      categoryId: this.$route.query.categoryId, // this.$route.query.categoryId
      page: this.page, // 1
      pageSize: this.pageSize
    })
    // 仅仅在第一次请求的时候判断要不要显示空状态就行了！
    if (data == null || data.length === 0) {
      this.flag = true
    }
    this.proList = data
  }
}
</script>

<style lang="less" scoped>
.search {
  padding-top: 46px;
  ::v-deep .van-icon-arrow-left {
    color: #333;
  }
  .tool {
    font-size: 24px;
    height: 40px;
    line-height: 40px;
  }

  .sort-btns {
    display: flex;
    height: 36px;
    line-height: 36px;
    .sort-item {
      text-align: center;
      flex: 1;
      font-size: 16px;
    }
  }
}

// 商品样式
.goods-list {
  background-color: #f6f6f6;
}
</style>
